package com.senlingspace.payment.douyin.bean.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 券状态单个查询
 *
 * @author lebronjames
 * @date 2024/07/23
 */
@Data
public class DouyinQueryTicketStatusResponse implements Serializable {

    /**
     * 团购券信息
     */
    @JsonProperty("data")
    private CertificateData data;

    /**
     * 异常信息
     */
    @JsonProperty("extra")
    private DouyinCommonResponse.Extra extra;

    @Data
    public static class CertificateData extends DouyinCommonResponse.CommonData {
        /**
         * 团购券信息
         */
        @JsonProperty("certificate")
        private Certificate certificate;

    }

    @Data
    public static class Certificate implements Serializable {
        /**
         * 券码 (未核销时不返回、已核销可撤销时不返回)
         */
        @JsonProperty("code")
        private String code;

        /**
         * 加密券码, 在验券接口传入
         */
        @JsonProperty("encrypted_code")
        private String encryptedCode;

        /**
         * 券码有效期（开始时间）（秒时间戳）
         */
        @JsonProperty("start_time")
        private Long startTime;

        /**
         * 券 ID
         */
        @JsonProperty("certificate_id")
        private Long certificateId;

        /**
         * 不可用时间信息（不包括开始时间和截止时间）
         */
        @JsonProperty("not_available_time_info")
        private NotAvailableTimeInfo notAvailableTimeInfo;

        /**
         * 核销类型
         *
         * @see com.senlingspace.payment.enums.DouyinUsedStatusTypeEnum
         */
        @JsonProperty("used_status_type")
        private Integer usedStatusType;

        /**
         * 核销记录
         */
        @JsonProperty("verify_records")
        private List<Verify> verifyRecords;

        /**
         * 商品信息
         */
        @JsonProperty("sku")
        private Sku sku;

        /**
         * 简化版核销信息（未核销时为空）
         */
        @JsonProperty("verify")
        private Verify verify;

        /**
         * 次卡信息
         */
        @JsonProperty("time_card")
        private TimeCard timeCard;

        /**
         * 状态
         *
         * @see com.senlingspace.payment.enums.DouyinTicketStatusEnum
         */
        @JsonProperty("status")
        private Integer status;

        /**
         * 券码有效期（截至时间）（秒时间戳）
         */
        @JsonProperty("expire_time")
        private Long expireTime;

        /**
         * 金额信息
         */
        @JsonProperty("amount")
        private Amount amount;

    }

    @Data
    public static class Sku implements Serializable {
        /**
         * 商品SKU ID
         */
        @JsonProperty("sku_id")
        private String skuId;

        /**
         * 商品名称
         */
        @JsonProperty("title")
        private String title;

        /**
         * 团购类型（团餐券/代金券）GROUPON/VOUCHER
         *
         * @see com.senlingspace.payment.enums.DouyinGrouponTypeEnum
         */
        @JsonProperty("groupon_type")
        private Integer grouponType;

        /**
         * 商品市场价
         */
        @JsonProperty("market_price")
        private Long marketPrice;

        /**
         * 商品开始时间（毫秒时间戳）
         */
        @JsonProperty("sold_start_time")
        private Long soldStartTime;

        /**
         * 商家系统（第三方）商品id
         */
        @JsonProperty("third_sku_id")
        private String thirdSkuId;

        /**
         * 商户id
         */
        @JsonProperty("account_id")
        private String accountId;
    }

    @Data
    public static class NotAvailableTimeInfo implements Serializable {
        /**
         * 核销时是否启用限制不可用时间
         */
        @JsonProperty("fulfil_enable")
        private Boolean fulfilEnable;

        /**
         * 不可用星期，1-星期一，2-星期2，。。。7-星期日
         */
        @JsonProperty("can_no_use_week_day")
        private List<Long> canNoUseWeekDay;

        /**
         * 不可以使用时间
         */
        @JsonProperty("can_no_use_date")
        private List<CanNoUseDate> canNoUseDate;
    }

    @Data
    public static class CanNoUseDate implements Serializable {
        /**
         * 结束时间（秒时间戳）
         */
        @JsonProperty("end_time")
        private Long endTime;

        /**
         * 开始时间（秒时间戳）
         */
        @JsonProperty("start_time")
        private Long startTime;
    }


    @Data
    public static class Verify implements Serializable {
        /**
         * 是否可撤销
         */
        @JsonProperty("can_cancel")
        private Boolean canCancel;

        /**
         * 验券类型
         *
         * @see com.senlingspace.payment.enums.DouyinVerifyTypeEnum
         */
        @JsonProperty("verify_type")
        private Integer verifyType;

        /**
         * 验券人抖音号
         */
        @JsonProperty("verifier_unique_id")
        private String verifierUniqueId;

        /**
         * 核销券门店id
         */
        @JsonProperty("poi_id")
        private Long poiId;

        /**
         * 次卡核销次序号
         */
        @JsonProperty("times_card_serial_num")
        private Long timesCardSerialNum;
        /**
         * 验券记录 ID
         */
        @JsonProperty("verify_id")
        private String verifyId;

        /**
         * 券 ID
         */
        @JsonProperty("certificate_id")
        private String certificateId;

        /**
         * 验券时间（单位毫秒，时间戳）
         */
        @JsonProperty("verify_time")
        private Long verifyTime;
    }

    @Data
    public static class TimeCard implements Serializable {
        /**
         * 当前券，所有次序号对应的金额
         */
        @JsonProperty("serial_amount_list")
        private List<SerialAmount> serialAmountList;

        /**
         * 次卡总次数
         */
        @JsonProperty("times_count")
        private Long timesCount;

        /**
         * 次卡使用次数
         */
        @JsonProperty("times_used")
        private Long timesUsed;

    }

    @Data
    public static class SerialAmount implements Serializable {
        /**
         * 次序号
         */
        @JsonProperty("serial_numb")
        private Long serialNumb;

        /**
         * 对应次序号的金额
         */
        @JsonProperty("amount")
        private Amount amount;
    }

    @Data
    public static class Amount implements Serializable {
        /**
         * 支付优惠, 单位分
         */
        @JsonProperty("payment_discount_amount")
        private Long paymentDiscountAmount;

        /**
         * 券码应付, 单位分
         */
        @JsonProperty("coupon_pay_amount")
        private Long couponPayAmount;

        /**
         * 划线价，单位分
         */
        @JsonProperty("list_market_amount")
        private Long listMarketAmount;

        /**
         * 平台优惠金额， 单位分
         */
        @JsonProperty("platform_discount_amount")
        private Long platformDiscountAmount;

        /**
         * 原价,单位分
         */
        @JsonProperty("original_amount")
        private Long originalAmount;

        /**
         * 实付金额,单位分
         */
        @JsonProperty("pay_amount")
        private Long payAmount;

        /**
         * 商家营销金额,单位分
         */
        @JsonProperty("merchant_ticket_amount")
        private Long merchantTicketAmount;

        /**
         * 原币种
         */
        @JsonProperty("original_currency")
        private String originalCurrency;

        /**
         * 原币种划线价
         */
        @JsonProperty("origin_list_market_amount")
        private Long originListMarketAmount;
    }

}
